/* 请求模块 */
import axios from 'axios'
import router from '@/router'
import store from '@/store/'
// 创建一个axios实例
const request = axios.create({
  // baseURL: '/api' // 请求基础路径
  baseURL: 'http://localhost:3000/'
})

// 创建一个refresh实例
const refreshToken = axios.create({
  // baseURL: '/api' // 请求基础路径
  baseURL: 'http://localhost:3000/'
})

// 请求拦截器
request.interceptors.request.use(
  // 所有请求都会经过这里
  function (config) {
    const { user } = store.state
    const token = user ? user.token : null
    // if (typeof token !== 'string') {
    //   token = JSON.stringify(token)
    // }
    if (token) {
      config.headers.Authorization = `Bearer ${token}`
    }
    return config
  },
  // 请求失败
  function (error) {
    return Promise.reject(error)
  }
)

// // 响应拦截器
request.interceptors.response.use(
  function (response) {
    // 响应码为2xx的，返回这个响应结果res
    return response
  },
  async function (error) {
    const status = error.response.status
    const { user } = store.state
    // const statusText = error.response.data.message
    // // 判断响应错误码，给予用户提示
    // 响应码为401，且vuex中有token，
    if (status === 401) {
      // 则为已经登陆且token过期，不然则是登陆密码账号错误
      if (!user || !user.token) {
        // 未登录，本地未存储token
        return jumpLogin()
      }
      // 使用 refresh_token 获取新的token
      try {
        const { data } = await refreshToken({
          method: 'PUT',
          url: '/user/refresh',
          headers: {
            Authorization: `Bearer ${user.refresh_token}`
          }
        })
        // user.token = data.data.token
        store.commit('setToken', data.data)
        return request(error.config)
      } catch (error) {
        // 刷新token失败
        jumpLogin()
      }
    }

    return Promise.reject(error)
  }
)

function jumpLogin () {
  router.replace({
    name: 'login',
    query: {
      redirect: router.currentRoute.fullPath
    }
  })
}

export default request
